<?php

namespace Juheip\IpService\platforms\jialai;

use Juheip\IpService\contract\AbstractPlatform;

// 使用 return $this->client->request('post', $this->config ['server_url'] . 'api-test', $this->signAct($data)); 发起远程请求
class JiaLaiPlatform extends AbstractPlatform
{
    private $config = [];

    public function init(array $config): self
    {
        $this->config = $config;

        return $this;
    }

    /**
     * key排序签名
     */
    public function signAct($body)
    {
        $authStr = "";
        $body ["st"] = time();
        $appid = '';
        $appkey = '';

        if (function_exists('config')) {
            $appid = (string) ($this->config ['appid'] ?? '');
            $appkey = (string) ($this->config ['app_key'] ?? '');
        }

        $body ["appid"] = $appid;
        ksort($body);

        foreach ($body as $item)
        {
            if(!is_object($item))
                $authStr=$authStr.$item;
        }

        $body ["sign"] = md5(md5($authStr).$appkey);

        return $body;
    }
    /**
     * 获取当前账户的可用余额
     * @return @json
     */
    public function getMyPoint()
    {
        return $this->client->request('post', $this->config ['server_url'] . 'Get_MyPoint', $this->signAct([]));
    }

    /**
     * 获取所有动态服务器列表
     * @return @json
     */
    public function getDynamicLine($type=3)
    {
        $post_data = array(
            'type'=>$type,
        );

        return $this->client->request('post', $this->config ['server_url'] . 'Get_Dynamic_Line', $this->signAct($post_data));
    }

    /**
     * * 获取动态用户列表
     * @param $page         *当前分页
     * @param $page_count   *分页条目数 1-100
     * @param $t_id         @接入方客户唯一值UID用于查询客户账号列表、0或缺省则查询当前应用下全部客户账号，非必填字段
     * @param $user         @根据账号名称查询账号信息，非必填字段
     * @return @json
     */
    public function getDynamicAccount($page,$page_count,$t_id=0,$user="")
    {
        $post_data = array(
            't_id'=>$t_id,
            'user'=>$user,
            'page'=>$page,
            'page_count'=>$page_count,
        );

        return $this->client->request('post', $this->config ['server_url'] . 'Get_Dynamic_Account', $this->signAct($post_data));
    }

    /**
     * * 创建动态账号
     * @param $width        *订购带宽 1-20 单位 Mbps
     * @param $meal         *订购套餐 1-5 分别为 天卡、周卡、月卡、季卡、年卡,31为2小时测试卡，每个用户只允许开通一次
     * @param $account      *拨号账号 6-20位字符串。
     * @param $password     *拨号密码 6-20位字符串
     * @param $conn_max     *连接数（同账号可以在不同服务器中同时在线的数量）1-100
     * @param $t_id         *接入方平台注册用户的唯一值，用于绑定客户账号
     * @return @json
     */
    public function createDynamic($width,$meal,$account,$password,$conn_max,$t_id)
    {
        $post_data = array(
            'width'=>$width,
            'combos'=>$meal,
            'account'=>$account,
            'password'=>$password,
            'conn_max'=>$conn_max,
            't_id'=>$t_id,
        );

        return $this->client->request('post', $this->config ['server_url'] . 'Create_Dynamic', $this->signAct($post_data));
    }
    /**
     * * 创建平台第三方接入账号
     * @param $phone        *接入方平台用户注册手机号 同应用下手机号码不可重复
     * @param $cn_name      *用户实名认证后的真实姓名
     * @param $cn_id        *用户实名认证后的身份证号码
     * @param $t_id         *接入方平台中客户唯一的身份标识，整型 数字范围1-999999999
     * @return @json
     */
    public  function createUsers($phone,$cn_name,$cn_id,$t_id)
    {
        $post_data = array(
            'phone'=>$phone,
            'cn_name'=>$cn_name,
            'cn_id'=>$cn_id,
            't_id'=>$t_id,
        );

        return $this->client->request('post', $this->config ['server_url'] . 'Create_Users', $this->signAct($post_data));
    }

    /**
     * * 获取代理商基础定价
     * @param $width        *订购带宽 1-20 单位 Mbps
     * @param $meal         *订购套餐 1-5 分别为 天卡、周卡、月卡、季卡、年卡
     * @param $conn_max     *连接数（同账号可以在不同服务器中同时在线的数量）1-100
     * @return @json
     */
    public function getDynamicPoint($width,$meal,$conn_max)
    {
        $post_data = array(
            'width'=>$width,
            'combos'=>$meal,
            'conn_max'=>$conn_max,
        );

        return $this->client->request('post', $this->config ['server_url'] . 'Get_Dynamic_Point', $this->signAct($post_data));
    }

    /**
     * * 续费动态账号
     * @param $account      *拨号账号 6-20位字符串。
     * @param $meal         *订购套餐 1-5 分别为 天卡、周卡、月卡、季卡、年卡
     * @return @json
     */
    public function reNewDynamic($account,$meal)
    {
        $post_data = array(
            'account'=>$account,
            'combos'=>$meal,
        );

        return $this->client->request('post', $this->config ['server_url'] . 'Renew_Dynamic', $this->signAct($post_data));
    }

    /**
     * * 修改动态账户密码
     * @param $account      *拨号账号 6-20位字符串。
     * @param $password     *新密码 6-20位字符串
     * @return @json
     */
    public function reSetDynamicPassword($account,$password)
    {
        $post_data = array(
            'account'=>$account,
            'password'=>$password,
        );

        return $this->client->request('post', $this->config ['server_url'] . 'Reset_Password_Dynamic', $this->signAct($post_data));
    }

    /**
     * * 获取动态服务器完整列表
     * @param $page         *当前分页
     * @param $page_count   *分页条目数 1-100
     * @param $account      *拨号账号 6-20位字符串。
     * @return @json
     */
    public function getDynamicOnline($account,$page,$page_count)
    {
        $post_data = array(
            'account'=>$account,
            'page'=>$page,
            'page_count'=>$page_count,
        );

        return $this->client->request('post', $this->config ['server_url'] . 'Get_Dynamic_Online', $this->signAct($post_data));
    }

    /**
     * * 针对动态在线用户踢出下线
     * @param $sid      *sid参数即为{getDynamicOnline}函数锁返回的在线ID，应为32位字符串。
     * @return @json
     */
    public function kickOffDynamicLine($sid)
    {
        $post_data = array(
            'sid'=>$sid,
        );

        return $this->client->request('post', $this->config ['server_url'] . 'Kick_Off_Dynamic_Line', $this->signAct($post_data));
    }

    /**
     * * 设置动态账号防火墙状态
     * @param $account      *拨号账号 6-20位字符串。
     * @param $status       *防火墙状态：0关闭、1开启。
     * @return @json
     */
    public function setDynamicFirewallStatus($account,$status)
    {
        $post_data = array(
            'account'=>$account,
            'status'=>$status,
        );

        return $this->client->request('post', $this->config ['server_url'] . 'Set_Dynamic_Firewall_Status', $this->signAct($post_data));
    }

    /**
     * * 上传用户手持身份证照片
     * @param $t_id             *接入方平台中客户唯一的身份标识，整型 数字范围1-999999999
     * @param $upload_img       *上传图片文件，格式要求jpg格式，文件小于1MB。
     * @return @json
     */
    public function uploadExamine($t_id,$upload_img)
    {
        $post_data = array(
            't_id'=>$t_id,
            'upload_img'=>new \CURLFile($upload_img->getRealPath(),$upload_img->getOriginalMime(),$upload_img->getOriginalName()),
        );

        return $this->client->request('post', $this->config ['server_url'] . 'Upload_Examine', $this->signAct($post_data));
    }

    /**
     * * 上传用户手持身份证照片
     * @param $t_id             *接入方平台中客户唯一的身份标识，整型 数字范围1-999999999
     * @param $upload_imgurl       *本地图片URL，格式要求jpg格式，文件小于1MB。
     * @return @json
     */
    public function uploadExamineFile($t_id,$upload_imgurl)
    {
        $post_data = array(
            't_id'=>$t_id,
            'upload_img'=>new \CURLFile($upload_imgurl,mime_content_type($upload_imgurl),basename($upload_imgurl)),
        );

        return $this->client->request('post', $this->config ['server_url'] . 'Upload_Examine', $this->signAct($post_data));
    }

    public function uploadExaminePrepare($t_id,$upload_imgurl)
    {
        $post_data = array(
            't_id'=>$t_id,
            'upload_img'=>new \CURLFile($upload_imgurl,mime_content_type($upload_imgurl),basename($upload_imgurl)),
        );

        return $this->client->request('post', $this->config ['server_url'] . 'Upload_Examine_Prepare', $this->signAct($post_data));
    }

    /**
     * * 查询第三方接入用户状态
     * @param $t_id             *接入方平台中客户唯一的身份标识，整型 数字范围1-999999999
     * @return @json
     */
    public function examineStatus($t_id)
    {
        $post_data = array(
            't_id'=>$t_id,
        );

        return $this->client->request('post', $this->config ['server_url'] . 'Examine_Status', $this->signAct($post_data));
    }

    /**
     * * 查询第三方接入用户状态
     * @param $account             *拨号账号 6-20位字符串。
     * @return @json
     */
    public function dynamicAccountExists($account)
    {
        $post_data = array(
            'account'=>$account,
        );

        return $this->client->request('post', $this->config ['server_url'] . 'Dynamic_Account_Exists', $this->signAct($post_data));
    }
    /**
     * * 变更静态账户出口指向
     * @param $account             *拨号账号 6-20位字符串。
     * @param $ename                 *出口服务器名 1-20位字符串。
     * @param $pool                 *出口线路名 1-20位字符串。
     * @return @json
     */
    public function editStaticOut($account,$ename,$pool)
    {
        $post_data = array(
            'account'=>$account,
            'ename'=>$ename,
            'pool'=>$pool,
        );

        return $this->client->request('post', $this->config ['server_url'] . 'Edit_Static_Out', $this->signAct($post_data));
    }
    /**
     * * 获取指定城市的静态出口列表
     * @param $city             *城市ID
     * @return @json
     */
    public function getStaticOut($city)
    {
        $post_data = array(
            'city'=>$city,
        );

        return $this->client->request('post', $this->config ['server_url'] . 'Get_Static_Out', $this->signAct($post_data));
    }
    /**
     * * 获取独立定价账户下的产品列表
     * @return @json
     */
    public function getDynamicProduct()
    {
        return $this->client->request('post', $this->config ['server_url'] . 'Get_Dynamic_Product', $this->signAct([]));
    }
    /**
     * * 获取独立定价账户下的产品列表所对应的带宽套餐
     * @return @json
     */
    public function getDynamicProductWidth($meal)
    {
        $post_data = array(
            'meal'=>$meal,
        );

        return $this->client->request('post', $this->config ['server_url'] . 'Get_Dynamic_Product_Width', $this->signAct($post_data));
    }

    /**
     * 获取扁平动态线路列表
     * @return \stdClass|null
     */
    public function getDynamicLineFlat()
    {
        return $this->client->request('post', $this->config ['server_url'] . 'Get_Dynamic_Line_Flat', $this->signAct([]));
    }

    /**
     * 获取行政区划数据
     * @return \stdClass|null
     */
    public function getAreaData()
    {
        return $this->client->request('post', $this->config ['server_url'] . 'Get_Area_Data', $this->signAct([]));
    }

    /**
     * 检查第三方用户是否存在
     * @param int|string $t_id 第三方用户ID
     * @param string $phone 注册手机号
     * @return \stdClass|null
     */
    public function checkUserExists($t_id, $phone)
    {
        $post_data = array(
            't_id'  => $t_id,
            'phone' => $phone,
        );

        return $this->client->request('post', $this->config ['server_url'] . 'Check_User_Exists', $this->signAct($post_data));
    }

    /**
     * 退款指定账号未到期订单
     * @param string $account 动态拨号账号
     * @return \stdClass|null
     */
    public function refountAccountOrder($account)
    {
        $post_data = array(
            'account' => $account,
        );

        return $this->client->request('post', $this->config ['server_url'] . 'Refount_Account_Order', $this->signAct($post_data));
    }

    /**
     * 自由设置IM防火墙状态
     * @param string $account 动态拨号账号
     * @param int|string $t_id 第三方用户ID
     * @param int $fwstatus 防火墙开关 1开 2关
     * @return \stdClass|null
     */
    public function freeFirewall($account, $t_id, $fwstatus)
    {
        $post_data = array(
            'account'  => $account,
            't_id'     => $t_id,
            'fwstatus' => $fwstatus,
        );

        return $this->client->request('post', $this->config ['server_url'] . 'Free_Firewall', $this->signAct($post_data));
    }

    /**
     * 获取私有产品清单
     * @return \stdClass|null
     */
    public function getPrivateProduct()
    {
        return $this->client->request('post', $this->config ['server_url'] . 'GetPrivateProduct', $this->signAct([]));
    }

    /* ---------------- Compatibility Aliases (JLSDK parity) ---------------- */
    // 为兼容历史 JlSDK 方法命名，以下别名全部转调到现有实现。

    /** 创建动态账号（别名） */
    public function createDynamicAccount($width,$meal,$account,$password,$conn_max,$t_id)
    { return $this->createDynamic($width,$meal,$account,$password,$conn_max,$t_id); }

    /** 获取动态账号列表（别名） */
    public function getDynamicAccountList($page,$page_count,$t_id=0,$user="")
    { return $this->getDynamicAccount($page,$page_count,$t_id,$user); }

    /** 获取动态服务器列表（别名） */
    public function getDynamicServers($type=3)
    { return $this->getDynamicLine($type); }

    /** 踢下线（别名） */
    public function kickOffDynamic($sid)
    { return $this->kickOffDynamicLine($sid); }

    /** 设置防火墙状态（别名） */
    public function setFirewallStatus($account,$status)
    { return $this->setDynamicFirewallStatus($account,$status); }

    /** 动态账号是否存在（别名） */
    public function isDynamicAccountExists($account)
    { return $this->dynamicAccountExists($account); }

    /** 在线列表（别名） */
    public function getDynamicOnlineList($account,$page,$page_count)
    { return $this->getDynamicOnline($account,$page,$page_count); }

    /** 价格查询（别名） */
    public function getDynamicPrice($width,$meal,$conn_max)
    { return $this->getDynamicPoint($width,$meal,$conn_max); }

    /** 静态出口设置（别名） */
    public function setStaticOut($account,$ename,$pool)
    { return $this->editStaticOut($account,$ename,$pool); }

    /** 静态出口列表（别名） */
    public function listStaticOut($city)
    { return $this->getStaticOut($city); }

    /** 扁平线路列表（别名） */
    public function getDynamicLineFlatList()
    { return $this->getDynamicLineFlat(); }

    /** 行政区划（别名） */
    public function getArea()
    { return $this->getAreaData(); }

    /** 创建第三方用户（别名） */
    public function createThirdPartyUser($phone,$cn_name,$cn_id,$t_id)
    { return $this->createUsers($phone,$cn_name,$cn_id,$t_id); }

    /** 退款未到期订单（别名，修正拼写） */
    public function refundAccountOrder($account)
    { return $this->refountAccountOrder($account); }

    /** 私有产品列表（别名） */
    public function getPrivateProductList()
    { return $this->getPrivateProduct(); }

    /** 产品列表（别名） */
    public function getProductList()
    { return $this->getDynamicProduct(); }

    /** 产品带宽列表（别名） */
    public function getProductWidth($meal)
    { return $this->getDynamicProductWidth($meal); }

    /** 检查第三方用户（别名） */
    public function checkThirdUserExists($t_id,$phone)
    { return $this->checkUserExists($t_id,$phone); }
}
